package ui;

import java.awt.Image;
import java.util.HashMap;

import javax.swing.JFrame;
import javax.swing.JPanel;

import ui.creatorsscreen.CreatorsScreenPanel;
import ui.mainscreen.MainScreenPanel;
import ui.newgamescreen.NewGameScreenPanel;
import ui.universescreen.UniverseScreenPanel;

/**
 * Класс служит для управления панелями экранов
 * 
 * @author Rumata
 */
public final class ScreenPanelManager {

	/* Реализация шаблона - Синглтон */
	private static ScreenPanelManager instance;

	/**
	 * @return the instance
	 */
	public static ScreenPanelManager getInstance() {
		if (instance == null) {
			instance = new ScreenPanelManager();
		}
		return instance;
	}

	/**
	 * Частный конструктор синглтона
	 */
	private ScreenPanelManager() {

	}

	private MainWindow frame;

	/* Перечисление идентификаторов панелей */
	public enum ID {
		MSP, CSP, NGSP, USP
	};

	/* Текущая АКТИВНАЯ панель-экран */
	private ScreenPanel currentScreen = null;

	/**
	 * Метод для получения экземляра панели-экрана по его идентификатору
	 * 
	 * @param index идентификатор панели
	 * @return экземпляр панели
	 * @throws IllegalArgumentException
	 */
	private ScreenPanel getScreenByID(ID index) {
		switch (index) {
			case MSP: {
				return MainScreenPanel.getInstance();
			}
			case CSP: {
				return CreatorsScreenPanel.getInstance();
			}
			case NGSP: {
				return NewGameScreenPanel.getInstance();
			}
			case USP: {
				return UniverseScreenPanel.getInstance();
			}
			default: {
				throw new IllegalArgumentException();
			}
		}
	}

	/**
	 * Метод для отображения панели-экрана по ее идентификатору
	 * 
	 * @param index идентификатор панели-экрана
	 * @throws IllegalArgumentException при попытке активировать текущий экран
	 */
	public void activateScreenByID(ID index) {
		// TODO сделать нормальный переход от экрана к экрану без использования
		// видимости панелей
		ScreenPanel newScreen = getScreenByID(index);

		if (newScreen == currentScreen) {
			throw new IllegalArgumentException();
		}

		frame.getContentPane().add(newScreen);
		newScreen.setVisible(true);

		if (currentScreen != null) {
			currentScreen.setVisible(false);
		}

		currentScreen = newScreen;
	}

	/**
	 * Метод для установки нового изображения на фоне
	 * 
	 * @param image новое изображение для фона
	 */
	public void changeBackgroundByID(ID index, Image image) {
		getScreenByID(index).setImage(image);
	}

	/**
	 * Метод для получения главного окна игры
	 * 
	 * @return Главное окно игры
	 */
	public JFrame getFrame() {
		return frame;
	}

	/**
	 * Метод для инициализации менеджера панелей окном игры
	 * 
	 * @param frame Главное окно игры
	 */
	public void setFrame(MainWindow frame) {
		this.frame = frame;
	}

}
